<?php

namespace app\admin\model\weixin;

use think\Model;
use fast\Random;
use think\Db;
use think\Exception;
use addons\weixin\library\WechatService;

class User extends Model
{
	// 表名
	protected $name = 'weixin_user';
	
	// 自动写入时间戳字段
	protected $autoWriteTimestamp = 'int';
	
	// 定义时间戳字段名
	protected $createTime = 'createtime';
	protected $updateTime = false;
	protected $deleteTime = false;
	
	// 追加属性
	protected $append = [
		'subscribe_time_text'
	];
	
	public function getSubscribeTimeTextAttr($value, $data)
	{
		$value = $value ? $value : (isset($data['subscribe_time']) ? $data['subscribe_time'] : '');
		return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
	}
	
	protected function setSubscribeTimeAttr($value)
	{
		return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
	}
	
	public function fauser()
	{
		return $this->belongsTo('app\admin\model\User', 'uid', 'id', [], 'LEFT')->setEagerlyType(0);
	}
	
	/**
	 * 微信授权成功后
	 * @param $event
	 * @throws \think\db\exception\DataNotFoundException
	 * @throws \think\db\exception\ModelNotFoundException
	 * @throws \think\exception\DbException
	 */
	public static function onWechatOauthAfter($wechatInfo, $spreadId, $login_type)
	{
		if (isset($wechatInfo['unionid'])) {
			$where['unionid'] = $wechatInfo['unionid'];
		} else {
			$where['openid'] = $wechatInfo['openid'];
		}
		$uid = self::where($where)->value('uid');
		if ($uid) {
			//更新微信会员
			self::updateWechatUser($wechatInfo, $uid, 'uid');
			//检查是否存在主会员数据
			if (\app\admin\model\User::get($uid)) {
				self::updateUser($wechatInfo, $uid);
			}
			//检查是否存在粉丝数据
			$fans = \app\admin\model\weixin\Fans::where($where)->find();
			if ($fans) {
				\app\admin\model\weixin\Fans::where($where)->update(['nickname' => $wechatInfo['nickname'], 'headimgurl' => $wechatInfo['headimgurl']]);
			}
		} else {
			$userModel = self::addUser($wechatInfo);
			//设置推荐人
			$wechatInfo['parent_id'] = $spreadId;
			//设置会员主表ID
			$wechatInfo['uid'] = $uid = $userModel->id;
			//新增微信会员
			self::addWechatUser($wechatInfo);
		}
		return $uid;
	}
	
	/**
	 * uid获取小程序Openid
	 * @param string $uid
	 * @return bool|mixed
	 */
	public static function getOpenId($uid = '')
	{
		if ($uid == '') {
			return false;
		}
		return self::where('uid', $uid)->value('routine_openid');
	}
	
	/**
	 * TODO 用uid获得openid
	 * @param $uid
	 * @param string $openidType
	 * @return mixed
	 * @throws \Exception
	 */
	public static function uidToOpenid($uid, $openidType = 'routine_openid')
	{
		$openid = self::where('uid', $uid)->value($openidType);
		return $openid;
	}
	
	/**
	 * TODO 用openid获得uid
	 * @param $openid
	 * @param string $openidType
	 * @return mixed
	 */
	public static function openidTouid($openid, $openidType = 'openid')
	{
		return self::where($openidType, $openid)->where('user_type', '<>', 'h5')->value('uid');
	}
	
	/**
	 * 添加一条数据
	 * @param $data
	 * @param $id
	 * @param $field
	 * @return bool $type 返回成功失败
	 */
	public static function addWechatUser($data)
	{
		$model = new self;
		return $model->allowField(true)->save($data);
	}
	
	/**
	 * 修改一条数据
	 * @param $data
	 * @param $id
	 * @param $field
	 * @return bool $type 返回成功失败
	 */
	public static function updateWechatUser($data, $id, $field = null)
	{
		$model = new self;
		return $model->allowField(true)->save($data, [$field => $id]);
	}
	
	/**
	 * 新建微信会员
	 * @param $data
	 * @param $id
	 * @param $field
	 * @return bool $type 返回成功失败
	 */
	public static function addUser($wechatUser)
	{
		$user = false;
		//账号注册时需要开启事务,避免出现垃圾数据
		Db::startTrans();
		try {
			$salt = Random::alnum();
			$data = [
				'username'  => 'wx' . time(),
				'salt'      => $salt,
				'password'  => md5(md5(time()) . $salt),
				'nickname'  => $wechatUser['nickname'] ?: '',
				'avatar'    => $wechatUser['headimgurl'] ?: '',
				'jointime'  => time(),
				'joinip'    => request()->ip(),
				'logintime' => time(),
				'loginip'   => request()->ip(),
				'status'    => 'normal',
			];
			$user = \app\admin\model\User::create($data, true);
			Db::commit();
		} catch (Exception $e) {
			Db::rollback();
		}
		return $user;
	}
	
	/**
	 * 更新用户信息
	 * @param $wechatUser 用户信息
	 * @param $uid 用户uid
	 * @return bool|void
	 * @throws \think\db\exception\DataNotFoundException
	 * @throws \think\db\exception\ModelNotFoundException
	 * @throws \think\exception\DbException
	 */
	public static function updateUser($wechatUser, $uid)
	{
		$userInfo = \app\admin\model\User::where('id', $uid)->find();
		if (!$userInfo) {
			return;
		}
		$data = [
			'nickname' => $wechatUser['nickname'] ?: '',
			'avatar' => $wechatUser['headimgurl'] ?: '',
			'logintime' => time(),
			'loginip' => request()->ip()
		];
		$model = new \app\admin\model\User();
		return $model->save($data, ['id' => $uid]);
	}
	
	
	/**
	 * 得到微信标签
	 * @author Created by Xing <464401240@qq.com>
	 */
	public static function getTag()
	{
        $tag = WechatService::userTagService()->list()['tags'] ?: array();
        $list = [];
        foreach ($tag as $g) {
            $list[$g['id']] = $g;
        }
		return $list;
	}
}
